package demo03

import (
	"fmt"
	"time"
)

type Server04 struct {
	addr     string
	port     string
	timeout  time.Duration
	maxConns int
}

type Option func(*Server04)

func Timeout(timeout time.Duration) Option {
	return func(s *Server04) {
		s.timeout = timeout
	}
}

func MaxConns(maxConns int) Option {
	return func(s *Server04) {
		s.maxConns = maxConns
	}
}

func Create(addr, port string, options ...Option) (*Server04, error) {
	s := Server04{
		addr:     addr,
		port:     port,
		timeout:  500 * time.Millisecond,
		maxConns: 20,
	}
	for _, option := range options {
		option(&s)
	}
	return &s, nil
}

/*
这个需要注意的是 type Option func(*Server)
这个看起来比较整洁和优雅，对外的接口只有一个Create。
相比于Builder模式，不需要引入一个Builder对象。
对比配置化的模式，也不需要引入一个新的Config。
*/
func OptionFunDemo() {
	server04, err := Create("127.0.0.1", "8080", Timeout(3*time.Second), MaxConns(1000))
	fmt.Println(server04)
	fmt.Println(err)
}
